// bzoj2667
// 题意：
// 现在有个工厂，在零时刻，生产力为0, 每个时刻，你可以选择提高一个生产力，
// 或者选择生产当前生产力数值的商品。现在有n(<=15)个订单，每个订单为一个
// 三元组(ti, gi, mi)表示如果恰好在时刻ti交付gi单位个物品，就可以得到mi的钱。
// 现在问你最多可以获得多少钱。(ti<=10^5, gi<=10^9, mi<=10^9)
//
// 题解：
// 首先2^n枚举所有订单，现在对于这些订单，我们还是要按贪心的策略，
// 先尽可能多的提高生产力，再生产，这个对于一个订单很明显是对的，
// 但是如果有很多个订单，就不能盲目的一直连续提高生产力，因为这可能导致
// 后面的订单无法被交付，所以我们要按时间一段一段做。
//
// 对于每个时刻订单，我们维护出当前生产力数值，当前货物量，然后算一下
// 从这个时刻到之后所有物品，要满足生产条件，最多可以连续提升生产力的
// 最大值是多少时间（贪心），然后算一下就行。
//
// 然后每完成一个订单准备生产下一个订单时，都重新更新出这个时间，
// 如果某个时刻某个订单不能完成，那么就不能完成。
//
// run: $exec < input
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>

struct data { int t, g, m; };
data zero;

bool operator<(data const & a, data const & b)
{
	return a.t < b.t;
}

std::vector<data> da;

int n;

int calc(long long p, long long t, long long s)
{
	long long a = 1, b = p - t, c = s - p * t;
	long long delta = b * b - 4 * a * c;
	if (delta < 0) return -1;
	return (-b + sqrt(delta)) / (2.0 * a);
}

long long check(int st)
{
	std::vector<data> a;
	a.push_back(zero);
	long long money = 0;
	for (int i = 0; i < n; i++)
		if ((st >> i) & 1) { a.push_back(da[i]); money += da[i].m; }
	int l = a.size();
	long long now = 0, productivity = 1;
	for (int i = 1; i < l; i++) {
		int d = a[i].t - a[i - 1].t;
		long long sum = 0;
		for (int j = i; j < l; j++) {
			sum += a[j].g;
			if (sum > now) d = std::min(d, calc(productivity, a[j].t - a[i - 1].t, sum - now));
		}
		if (d < 0) return 0;
		productivity += d;
		now += productivity * (a[i].t - a[i - 1].t - d);
		now -= a[i].g;
	}
	return money;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	da.resize(n);
	for (int i = 0; i < n; i++) std::cin >> da[i].t >> da[i].g >> da[i].m;
	std::sort(da.begin(), da.end());

	long long ans = 0;
	for (int i = 0; i < (1 << n); i++)
		ans = std::max(ans, check(i));
	std::cout << ans << "\n";
}

